﻿#include <iostream>
#include <string>
using namespace std;

//字符串里面最后一个单词的长度
//https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking
//int main() {
//    string s;
//    //getline函数，默认按换行作为读取结束标志，然后将数据存入string
//    //这里使用getline函数是因为，cin 默认是按照空格作为读取结束标志
//    
//    while (getline(cin, s))
//    {
//        size_t pos = s.rfind(' ');//rfind从后往前查找没找到返回string::npos
//        if (pos == string::npos)
//        {
//            cout << s.size() << endl;//没找到说明第一个单词就是最后一个单词，输出s.size(),s.szie就是单词大小
//        }
//        else
//        {
//            cout << s.size() - (pos + 1) << endl; //(pos + 1)表示最后一个单词前面有多少个字符 
//        }
//    }
//    
//    return 0;
//}

//验证一个字符串是否是回文


//https://leetcode.cn/problems/valid-palindrome/
//class Solution {
//public:
//    bool isPalindrome(string s) {
//        //把字母全部转换为小写
//        for (int i = 0; i < s.size(); i++)
//        {
//            s[i] = tolower(s[i]);
//        }
//        int begin = 0;
//        int end = s.size()-1;
//        while (begin <= end)//begin > end代表比较完了
//        {
//            while (!(isalpha(s[begin])||isalnum(s[begin]))&& begin <= end) // 左边读取数字或者字母
//            {
//                begin++;
//            }
//            if (begin > end)//如果是读取导致的越界表示这段字符串里没有字母或者数字
//            {
//                return true;
//            }
//
//            while (!(isalpha(s[end])|| isalnum(s[end])) && begin <= end)//右边读取数字或者字母
//            {
//                end--;
//            }
//
//            if (s[begin] != s[end]) //判断左边和右边读取的字符是否相等
//            {
//                return false;
//            }
//            begin++;
//            end--;
//        }
//
//        return true;//这里表示
//    }
//};

//空间换时间
//class Solution {
//public:
//    bool isPalindrome(string s) {
//        for (int i = 0; i < s.size(); i++)
//        {
//            s[i] = tolower(s[i]);
//        }
//        string s2;
//        for (int i = 0; i < s.size(); i++)
//        {
//            if (isalpha(s[i]) || isalnum(s[i]))
//            {
//                s2 += s[i];
//            }
//        }
//        if (s2.size() == 0)
//        {
//            return true;
//        }
//        int begin = 0;
//        int end = s2.size() - 1;
//        while (begin <= end)//begin > end代表比较完了
//        {
//            if (s2[begin] != s2[end]) //判断左边和右边读取的字符是否相等
//            {
//                return false;
//            }
//            begin++;
//            end--;
//        }
//        return true;
//    }
//};

//反转字符串 II
////https://leetcode.cn/problems/reverse-string-ii/
//class Solution {
//public:
//    
//    string reverseStr(string s, int k) {
//        int size = s.size();//记录剩余字符有多少个，
//        int begin = 0;
//        int end = begin + k-1;
//
//        /*输入：s = "abcdefg", k = 2
//            输出："bacdfeg"*/
//
//        while (size >= 2*k)//剩余字符大于2k就反转这 2k 字符中的前 k 个字符。
//        {
//            swap(s, begin, end);//这里begin和end都是传值不用担心会改变原来的begin和end
//          
//            begin += 2 * k;//交换完成后begin进入到剩余字符的开头位置
//            end = begin + k-1;
//            size -= 2 * k; //剩余字符进行了一轮交换需要减去2K
//        }
//        if (size < k)//剩余字符少于 k 个，则将剩余字符全部反转
//        {
//            if (begin < s.size())//如果begin小于s.size()表示还有剩余的字符，如果不小于表示经过交换后，没有任何剩余字符也就没有必要交换了。
//            {
//                end = s.size() - 1;
//                swap(s, begin, end);
//            }
//
//        }
//        else
//        {
//            swap(s, begin, end);
//
//        }
//        return s;
//    }
//    void swap(string& s, int begin, int end)
//    {
//        int tmp;
//        while (begin <= end)
//        {
//            tmp = s[begin];
//            s[begin] = s[end];
//            s[end] = tmp;
//            begin++;
//            end--;
//        }
//    }
//};

//翻转字符串III：翻转字符串中的单词
//https://leetcode.cn/problems/reverse-words-in-a-string-iii/
//class Solution {
//public:
//    string reverseWords(string s) {
//        size_t begin = 0;
//        size_t pos = s.find(' ');//fin找到空格位置
//        
//        while (pos != string::npos)//如果pos == npos表示这是begin后面是最后一个字符串了 跳出循环
//        {
//            swap(s, begin, pos-1);//翻转单词
//            begin = pos + 1;//begin设置在下一个单词开头位置
//            pos = s.find(' ', begin);//从下一个单词开头位置查找空格
//        }
//        swap(s, begin, s.size()-1);//翻转最后一个单词
//        return s;
//    }
//
//    void swap(string& s, int begin, int end)
//    {
//        char tmp;
//        while (begin < end)
//        {
//            tmp = s[begin];
//            s[begin] = s[end];
//            s[end] = tmp;
//            begin++;
//            end--;
//        }
//    }
//};





